package com.hr.leetcode.分治和递归和回溯;

/**
 * @author 周恒哲
 * @date 2020/05/17
 * 50.Pow(x, n)问题
 **/
public class _50_Pow {
    /**
     * 当 x=0.0 时：直接返回 0.0 ，以避免后续 1 除以 0 操作报错。
     * 分析： 数字 0 的正数次幂恒为 0 ； 0 的 0 次幂和负数次幂没有意义，因此直接返回 0.0 即可。
     * 初始化 res=1 。
     * 当 n<0 时：把问题转化至 n≥0 的范围内，即执行 x = 1/x ，n=−n 。
     * 循环计算：当 n=0 时跳出。
     * 当 n & 1 = 1 时：将当前 x 乘入 res （即 res *= x）。
     * 执行 x = x^2（即 x *= x ）。
     * 执行 n 右移一位（即 n >>= 1）。
     * 返回 res
     */
    public double myPow(double x, int n) {
        if (x==0.0f){
            return 0.0d;
        }
        long b=n;
        double res=1.0;
        if (b<0){
            x=1/x;
            b=-b;
        }
        while (b>0){
            if ((b&1)==1){
                res*=x;
            }else{
                x*=x;
                b>>=1;
            }
        }
        return res;
    }
}